﻿using OT.HikiSecureCenterApis.Req;
using OT.HikiSecureCenterApis.Res;
using OT.HikiSecureCenterApis.Service.Resources.Req;
using OT.HikiSecureCenterApis.Service.Resources.Res;

namespace OT.HikiSecureCenterApis.Service.Resources
{
    /// <summary>
    /// 资源目录 --> 区域信息接口
    /// </summary>
    public partial class ResourcesService : ServiceBase
    {
        public ResourcesService(HikiSecureCenterApis _SecureCenterApis) : base(_SecureCenterApis) { }

        #region 查询接口        
        /// <summary>
        /// 获取根区域信息 /api/resource/v1/regions/root
        /// 获取根区域信息
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.0及以上版本</remarks>
        /// <returns><see cref="ResRoot"/></returns>
        public async Task<ResParameter<ResRoot>?> RegionsRootAsync() =>
          await SecureCenterApis.PostAsync<ResRoot>("/api/resource/v1/regions/root", 1.0);
        /// <summary>
        /// 查询区域列表v2 /api/resource/v1/regions/root
        /// 根据查询条件查询区域列表信息，主要用于区域信息查询过滤
        /// 相对V1接口，支持级联场景的区域查询。
        /// 当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResArea"/></returns>
        public async Task<ResParameter<ResPageData<ResArea>>?> RegionsNodesByParamsAsync(ReqAreaSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResArea>>("/api/irds/v2/region/nodesByParams", 1.3, req);
        /// <summary>
        /// 根据区域编号获取下一级区域列表v2 /api/resource/v2/regions/subRegions
        /// 根据用户请求的资源类型和资源权限获取父区域的下级区域列表，主要用于逐层获取父区域的下级区域信息，例如监控点预览业务的区域树的逐层获取。下级区域只包括直接下级子区域。
        /// 注：查询区域管理权限（resourceType为region），若父区域的子区域无权限、但是其孙区域有权限时，会返回该无权限的子区域，但是该区域的available标记为false（表示无权限）
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="parentIndexCode">必填 父区域编号，当指定parentIndexCode为-1时，表示查询根节点信息； 分页获取区域列表接口可以获取</param>
        /// <param name="resourceType">必填 	资源类型;详见附录A.2 资源类型
        /// 查询资源的类型，传region时查询的为用户有配置权限的区域树，
        /// 传资源类型如：camera、encodeDevice查询用户对该类资源有权限的区域树；
        /// 注：资源iasDevice\reader\floor不进行权限校验，即不传authCodes
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#ae7cd6c8
        /// 区域	region 门禁控制器 acsDevice 门禁点 door 门禁读卡器 reader 编码设备 encodeDevice 监控点 camera 报警输入 ioIn 报警输出 ioOut
        /// 入侵报警-报警主机 iasDevice 入侵报警-子系统 subSys 入侵报警-防区通道 defence 入侵报警-雷达设备 radarDevice 可视对讲设备 visDevice
        /// 可视对讲-室内机 visDeviceInDoor 可视对讲-门口机 visDeviceOutDoor 可视对讲-围墙机 visDeviceWallDoor 可视对讲-管理机 visDeviceManager
        /// 梯控-控制器 ecsDevice 梯控-读卡器 ladderCardReader 梯控-楼层 floor 动环设备 peDevice 动环-开关量 pemsIoOut 动环-传感器 transducer 
        /// 动环-环境量 sensor 停车场-抓拍机 snapshot 停车场-显示屏 led 停车场-出入口控制机 inoutControl 停车场-道闸 barrierGate
        /// 停车场-蓝牙读卡器 bluetoothReader 停车场-远距离读卡器 rfiReader 停车场-诱导管理器 guideManager 停车场-诱导/引导屏幕 guideLed
        /// 停车场-地磁管理器 geoManage 园区-卡口设备 monitoringPointDevice 园区-卡口点 monitoringPoint 园区-显示屏 gardenLed
        /// 紧急报警设备 emerdevice 对讲通道 talk 电锁 electricLock 警灯 alarmLamp 警号 siren
        /// </param>
        /// <param name="page">必填 当前页码，分页大小</param>
        /// <param name="authCodes">非必填 权限码集合;详见附录A.3 资源权限码权限码个数<=20个；单个权限码长度<=40Byte；
        /// 只有同时指定userId、authCodes时，才进行权限过滤；当指定多个权限码时，只返回同时具有这些权限码的区域
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#c92e73ec
        /// </param>
        /// <param name="cascadeFlag">非必填 级联标识，默认0 0: 全部，1: 本级，2: 级联</param>
        /// <returns><see cref="ResArea"/></returns>
        public async Task<ResParameter<ResPageData<ResArea>>?> RegionsSubRegionsAsync(string parentIndexCode, string resourceType, ReqPage page, IList<string> authCodes = null, int cascadeFlag = 0) =>
          await SecureCenterApis.PostAsync<ResPageData<ResArea>>("/api/resource/v2/regions/subRegions", 1.3, new
          {
              parentIndexCode = parentIndexCode,
              resourceType = resourceType,
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 1,
              authCodes = authCodes,
          });
        /// <summary>
        /// 分页获取区域列表 /api/resource/v1/regions
        /// 获取区域列表接口可用来全量同步区域信息，返回结果分页展示。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.0及以上版本</remarks>
        /// <param name="page">必填 当前页码，分页大小</param>
        /// <returns><see cref="ResRoot"/></returns>
        public async Task<ResParameter<ResPageData<ResRoot>>?> RegionsAsync(ReqPage page) =>
          await SecureCenterApis.PostAsync<ResPageData<ResRoot>>("/api/resource/v1/regions", 1.0, page);
        /// <summary>
        /// 根据编号获取区域详细信息 /api/resource/v1/region/regionCatalog/regionInfo
        /// 根据区域编号查询区域详细信息及总条数，主要用于区域详细信息展示。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="indexCodes">区域编号，最大1000个，根据查询区域列表v2接口获取返回报文中的indexCode字段</param>
        /// <returns><see cref="ResArea"/></returns>
        public async Task<ResParameter<ResPageData<ResArea>>?> RegionInfoAsync(IList<string> indexCodes) =>
          await SecureCenterApis.PostAsync<ResPageData<ResArea>>("/api/resource/v1/region/regionCatalog/regionInfo", 1.4, new { indexCodes = indexCodes });
        /// <summary>
        /// 增量获取区域数据 /api/resource/v1/region/timeRange
        /// 获取根区域信息
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="page">必填 页码，页大小，开始时间，结束时间</param>
        /// <returns><see cref="ResArea"/></returns>
        public async Task<ResParameter<ResPageData<ResArea>>?> RegionsTimeRangeAsync(ReqPageDate page) =>
          await SecureCenterApis.PostAsync<ResPageData<ResArea>>("/api/resource/v1/region/timeRange", 1.4, page);
        #endregion

        #region 区域管理接口
        /// <summary>
        /// 批量添加区域 /api/resource/v1/region/batch/add
        /// 支持区域的批量添加。三方可以自行指定区域的唯一标识，也可以由ISC平台自行生成。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="req">必填 实体</param>
        /// <returns><see cref="ResArea"/></returns>
        public async Task<ResParameter<ResAdd>?> RegionsAdddAsync(IList<ReqArea> req) =>
          await SecureCenterApis.PostAsync<ResAdd>("/api/resource/v1/region/batch/add", 1.3, req);
        /// <summary>
        /// 修改区域 /api/resource/v1/region/single/update
        /// 根据区域标志修改区域信息
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="req">必填 实体</param>
        /// <returns><see cref="ResArea"/></returns>
        public async Task<ResParameter<object>?> RegionsUpdateAsync(ReqArea req) =>
          await SecureCenterApis.PostAsync<object>("/api/resource/v1/region/single/update", 1.3, req);
        #endregion
    }
}
